package com.accelstack.cmp.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.servers.Server;
import io.swagger.v3.oas.models.ExternalDocumentation;
import org.springdoc.core.GroupedOpenApi;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;

/**
 * Swagger/OpenAPI配置类
 * 提供API文档和在线测试功能
 * 访问地址：http://localhost:8080/swagger-ui/index.html
 */
@Configuration
public class SwaggerConfig {
    
    @Value("${spring.application.name:CMP}")
    private String applicationName;
    
    @Value("${server.port:8080}")
    private String serverPort;
    
    /**
     * 配置OpenAPI基本信息
     */
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("AccelStack CMP API文档")
                        .description("AccelStack云管理平台 - RESTful API接口文档\n\n" +
                                "提供数据中心、服务器、虚拟化、容器等资源的管理接口。\n\n" +
                                "### 主要功能模块\n" +
                                "- **数据中心管理**: 数据中心、机架管理\n" +
                                "- **服务器管理**: 服务器、CPU、内存、磁盘、网卡管理\n" +
                                "- **GPU管理**: GPU型号、物理GPU、虚拟GPU管理\n" +
                                "- **虚拟化管理**: 虚拟化平台、虚拟化主机、虚拟机管理\n" +
                                "- **容器管理**: 容器、容器GPU映射、镜像模板管理\n" +
                                "- **监控管理**: 资源使用监控")
                        .version("1.0.0")
                        .contact(new Contact()
                                .name("AccelStack开发团队")
                                .email("dev@accelstack.com")
                                .url("https://www.accelstack.com"))
                        .license(new License()
                                .name("Apache 2.0")
                                .url("https://www.apache.org/licenses/LICENSE-2.0.html")))
                .servers(Arrays.asList(
                        new Server()
                                .url("http://localhost:" + serverPort)
                                .description("本地开发环境"),
                        new Server()
                                .url("http://localhost:" + serverPort + "/api")
                                .description("本地开发环境(带API前缀)")
                ))
                .externalDocs(new ExternalDocumentation()
                        .description("AccelStack项目文档")
                        .url("https://docs.accelstack.com"));
    }
    
    /**
     * 数据中心API分组
     */
    @Bean
    public GroupedOpenApi datacenterApi() {
        return GroupedOpenApi.builder()
                .group("1. 数据中心管理")
                .pathsToMatch("/api/datacenters/**", "/api/racks/**")
                .build();
    }
    
    /**
     * 服务器API分组
     */
    @Bean
    public GroupedOpenApi serverApi() {
        return GroupedOpenApi.builder()
                .group("2. 服务器管理")
                .pathsToMatch("/api/servers/**", "/api/cpus/**", 
                             "/api/disks/**", "/api/memory/**", 
                             "/api/network-interfaces/**")
                .build();
    }
    
    /**
     * GPU API分组
     */
    @Bean
    public GroupedOpenApi gpuApi() {
        return GroupedOpenApi.builder()
                .group("3. GPU管理")
                .pathsToMatch("/api/gpu-models/**", 
                             "/api/physical-gpus/**", 
                             "/api/virtual-gpus/**")
                .build();
    }
    
    /**
     * 虚拟化API分组
     */
    @Bean
    public GroupedOpenApi virtualizationApi() {
        return GroupedOpenApi.builder()
                .group("4. 虚拟化管理")
                .pathsToMatch("/api/virtualization-platforms/**", 
                             "/api/virtualization-hosts/**", 
                             "/api/virtual-machines/**")
                .build();
    }
    
    /**
     * 容器API分组
     */
    @Bean
    public GroupedOpenApi containerApi() {
        return GroupedOpenApi.builder()
                .group("5. 容器管理")
                .pathsToMatch("/api/containers/**", 
                             "/api/container-gpu-maps/**")
                .build();
    }
    
    /**
     * 监控API分组
     */
    @Bean
    public GroupedOpenApi monitoringApi() {
        return GroupedOpenApi.builder()
                .group("6. 监控管理")
                .pathsToMatch("/api/resource-usage/**")
                .build();
    }
    
    /**
     * 其他API分组
     */
    @Bean
    public GroupedOpenApi otherApi() {
        return GroupedOpenApi.builder()
                .group("7. 其他管理")
                .pathsToMatch("/api/manufacturers/**", 
                             "/api/warranties/**")
                .build();
    }
    
    /**
     * 所有API分组
     */
    @Bean
    public GroupedOpenApi allApi() {
        return GroupedOpenApi.builder()
                .group("0. 全部接口")
                .pathsToMatch("/api/**")
                .build();
    }
}
